package com.edu.exam.entity.system.config;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 试题编辑实体类
 *
 * <p>试题编辑实体用于记录对试题内容的编辑操作，包括内容修改、格式调整、属性更新等。
 * 支持完整的编辑过程追踪，记录编辑前后的内容差异、操作时间、操作人员等信息。</p>
 *
 * <p>核心功能：
 * - 内容编辑：记录试题内容的具体编辑操作
 * - 格式调整：记录试题格式的调整操作
 * - 属性修改：记录试题属性的修改操作
 * - 版本管理：支持编辑操作的版本控制</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class QuestionEdit {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 编辑ID
     *
     * <p>试题编辑操作的唯一标识符，采用UUID格式生成。
     * 用于编辑操作的唯一标识和结果追踪。</p>
     */
    @Column(name = "edit_id", nullable = false, length = 32, unique = true)
    private String editId;

    /**
     * 试题ID
     *
     * <p>被编辑试题的唯一标识符。
     * 关联Question表，标识编辑操作的目标试题。</p>
     */
    @Column(name = "question_id", nullable = false, length = 32)
    private String questionId;

    /**
     * 试卷ID
     *
     * <p>所属试卷的唯一标识符。
     * 可选字段，用于标识编辑操作所属的试卷上下文。</p>
     */
    @Column(name = "paper_id", length = 32)
    private String paperId;

    /**
     * 编辑会话ID
     *
     * <p>编辑会话的唯一标识符，用于关联同一编辑会话中的多个操作。
     * 支持编辑操作的分组管理和批量处理。</p>
     */
    @Column(name = "session_id", nullable = false, length = 32)
    private String sessionId;

    /**
     * 编辑类型
     *
     * <p>编辑操作的类型标识，用于区分不同类型的编辑操作。
     * 支持的类型包括：CONTENT_EDIT（内容编辑）、FORMAT_ADJUST（格式调整）、ATTR_MODIFY（属性修改）等。</p>
     */
    @Column(name = "edit_type", nullable = false, length = 20)
    private String editType;

    /**
     * 编辑前内容
     *
     * <p>编辑前的试题原始内容，用于对比和回滚。
     * 支持文本格式的内容存储。</p>
     */
    @Column(name = "original_content", columnDefinition = "TEXT")
    private String originalContent;

    /**
     * 编辑后内容
     *
     * <p>编辑后的试题新内容，记录编辑操作的结果。
     * 支持文本格式的内容存储。</p>
     */
    @Column(name = "edited_content", columnDefinition = "TEXT")
    private String editedContent;

    /**
     * 编辑字段
     *
     * <p>被编辑的字段名称，用于标识具体的编辑对象。
     * 支持多个字段组合，用逗号分隔。</p>
     */
    @Column(name = "edited_fields", length = 500)
    private String editedFields;

    /**
     * 编辑属性
     *
     * <p>JSON格式的属性编辑信息，记录属性修改的详细信息。
     * 包含修改前后的属性值、修改类型等。</p>
     */
    @Column(name = "edited_attributes", columnDefinition = "TEXT")
    private String editedAttributes;

    /**
     * 编辑描述
     *
     * <p>编辑操作的描述信息，记录编辑的具体内容和目的。
     * 可选字段，用于提供编辑操作的详细说明。</p>
     */
    @Column(name = "edit_description", length = 1000)
    private String editDescription;

    /**
     * 编辑者ID
     *
     * <p>执行编辑操作的用户ID，关联系统用户表。
     * 用于记录编辑操作的责任人和权限控制。</p>
     */
    @Column(name = "editor_id", nullable = false, length = 32)
    private String editorId;

    /**
     * 编辑者姓名
     *
     * <p>执行编辑操作的用户姓名，用于显示和记录。
     * 冗余存储用户姓名，避免频繁关联查询用户表。</p>
     */
    @Column(name = "editor_name", nullable = false, length = 100)
    private String editorName;

    /**
     * 编辑时间
     *
     * <p>编辑操作的执行时间，记录具体的编辑时间点。
     * 用于编辑操作的时间跟踪和分析。</p>
     */
    @Column(name = "edit_time", nullable = false)
    private LocalDateTime editTime;

    /**
     * 编辑时长（秒）
     *
     * <p>编辑操作的耗时，单位为秒。
     * 用于编辑操作的性能分析和优化。</p>
     */
    @Column(name = "edit_duration")
    private Integer editDuration;

    /**
     * 编辑状态
     *
     * <p>编辑操作的状态标识。
     * 支持的状态包括：IN_PROGRESS（进行中）、COMPLETED（已完成）、FAILED（失败）、CANCELLED（已取消）。</p>
     */
    @Column(name = "edit_status", nullable = false, length = 20)
    private String editStatus = "IN_PROGRESS";

    /**
     * 质量检查结果
     *
     * <p>编辑后质量检查的结果，JSON格式存储。
     * 包含质量评分、问题列表、改进建议等信息。</p>
     */
    @Column(name = "quality_check_result", columnDefinition = "TEXT")
    private String qualityCheckResult;

    /**
     * 版本号
     *
     * <p>编辑操作后的版本号，用于版本管理。
     * 支持版本控制和版本对比功能。</p>
     */
    @Column(name = "version_number")
    private Integer versionNumber;

    /**
     * 是否自动保存
     *
     * <p>标识编辑操作是否为自动保存。
     * true表示自动保存，false表示手动保存。</p>
     */
    @Column(name = "is_auto_save", nullable = false)
    private Boolean isAutoSave = false;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    // ===== 常量定义 =====

    /** 编辑类型 - 内容编辑 */
    public static final String EDIT_TYPE_CONTENT = "CONTENT_EDIT";

    /** 编辑类型 - 格式调整 */
    public static final String EDIT_TYPE_FORMAT = "FORMAT_ADJUST";

    /** 编辑类型 - 属性修改 */
    public static final String EDIT_TYPE_ATTRIBUTE = "ATTR_MODIFY";

    /** 编辑类型 - 批量编辑 */
    public static final String EDIT_TYPE_BATCH = "BATCH_EDIT";

    // 编辑状态常量
    /** 编辑状态 - 进行中 */
    public static final String STATUS_IN_PROGRESS = "IN_PROGRESS";

    /** 编辑状态 - 已完成 */
    public static final String STATUS_COMPLETED = "COMPLETED";

    /** 编辑状态 - 失败 */
    public static final String STATUS_FAILED = "FAILED";

    /** 编辑状态 - 已取消 */
    public static final String STATUS_CANCELLED = "CANCELLED";

}